package fr.alma.domo.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Properties;

/**
 *  La description d' un service.
 *  Utilisé pour faire la découverte dynamique de services
 * @author steg
 *
 */
@SuppressWarnings("serial")
public class Description implements Serializable {

	private final List<String> scopes = new ArrayList<String>();
	private final Properties properties = new Properties();
	private final Properties inSequences = new Properties();
	
	/**
	 * Constructeur par défaut
	 */
	public Description(){		
	}
	
	/**
	 * Constructeur de recopie
	 * 
	 *  param desc Un autre <code>Description</code>
	 */
	public Description(Description desc){
		scopes.addAll(desc.scopes);
		properties.putAll(properties);
		inSequences.putAll(inSequences);
	}
	
	/**
	 *  Permet d'ajouter le type de resource que l'on souhaite découvrir.
	 * 
	 * @param scope Un type de resource
	 */
	public void addScope(String scope){
		scopes.add(scope);
	}
	
	/**
	 * Ajout d'un critère de selection.
	 * Les critères se font par couple clé/valeur.
	 * @param name La clé ou nom de la propriété
	 * @param value La valeur souhaitée
	 */
	public void addProperty(String name,Object value){
		properties.put(name, value);
	}
	
	/**
	 * Ajout d'un critère de selection.
	 *
	 * @param name Doit représenter le nom d'une propriété de type {@code java.util.Collection}
	 * @param value <p>Valeur qui doit être contenue dans la collection <code>name</code> pour 
	 * qui le critère soit vérifié </p>
	 */
	public void addSequenceProperty(String name,Object value){
		inSequences.put(name, value);
	}
	
	/**
	 * Accéder à la liste des types souhaités
	 * @return
	 */
	public List<String> getScopes(){
		return Collections.unmodifiableList(scopes);
	}
	
	/**
	 * La liste des critères
	 * @return
	 */
	public Properties getProperties(){
		return properties;
	}
	
	/**
	 * La liste des critères de séquence
	 * @return
	 */
	public Properties getSequenceProperties(){
		return inSequences;
	}
	
}
